package com.example.springbootproject.mianshi.TransferArgs;


import java.util.Arrays;

/**
 * 方法参数传递
 */
public class TransArgs {


    /**
     *
     * change 方法栈帧
     *        a = i+1 = 2                                       常量池
     *        s += "world"
     *          原s地址 = str地址【0x9988】                              helllo
     *          在常量池创建一个字符串 并修改指向地址 【例】0x1234            helloworld
     *        n 地址等于num地址【0x7788】
     *          n+=1 会在堆中创建一个新的对象值为201
     *          指向地址变更 【例】0x5432
     *        arr 地址 0x3344 修改此地址中数组第一位
     *              arr[0]+=1 会将堆中数组[1,2,3,4,5] 修改为 [2,2,3,4,5]
     *        myData 地址 0x5566
     *          my.a += 1 将堆中a的值修改 11
     *
     *
     *
     *
     * main 方法栈帧                                    堆
     *      i = 1                                           200
     *      str 地址：【例】0x9988 指向常量池中hello            [1,2,3,4,5] -> [2,2,3,4,5]
     *      num 地址：【例】0x7788 指向堆中200                  int a = 10 -> a = 11
     *      arr 地址：【例】0x3444 指向堆中数组                  Integer 201
     *      my 地址：【例】0x5566 指向堆中 int a = 10
     *
     */

    public static void main(String[] args) {

        int i=1;
        String str = "hello";
        Integer num = 200;
        int[] arr = {1,2,3,4,5};
        MyData my = new MyData();

        // 每一个方法一个栈帧  基本数据类型是值传递  引用数据类型是引用传递(即地址)
        change(i, str, num, arr, my);

        System.out.println("i=" + i); // i=1
        System.out.println("str=" + str); // str = hello
        System.out.println("num=" + num); // num = 200
        System.out.println("arr=" + Arrays.toString(arr)); // arr = [2,2,3,4,5]
        System.out.println("my.a=" + my.a); // my.a = 11
    }




    public static void change(int a, String s, Integer n, int[] arr, MyData myData){
        a += 1;
        s += "world";
        n += 1;
        arr[0] += 1;
        myData.a += 1;

    }

//    public static void main(String[] args) {
//
//        /**
//         * i++ 先赋值 后运算
//         * ++i 先运算 后赋值
//         */
//        int i =1;
//        // 以下操作都是基于 i=1 注释掉其他运行
////        i = i++;
////        System.out.println(i); // i = 1 ; 将i压栈，然后i自增 变为2  然后把等号右边i(栈中i为1) 赋值给 i=1
//
////        i = ++i;
////        System.out.println(i); // i = 2
//
////        i += 1;
////        System.out.println(i); // i=2
//
////        int j = i++;
////        System.out.println("i="+i+" "+"j="+j); // i=2  j=1  将i压栈 后自增 i变为2 把栈中i的值赋给j j=1
//
//        int k = i + ++i * i++;
//        System.out.println("i="+i+" k="+k); // k =  局部变量表 i=1 将i=1压栈 先自增i=2 将++i后为2的i压栈， 再将 i=2压栈 然后i自增 局部变量表 i=3 等号右边运算后 k = 1+2*2 = 5  i = 3
//    }


}
class MyData{
    int a = 10;
}
